// 给定一个不含重复数字的数组 nums ，返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

// 示例 1：

// 输入：nums = [1,2,3]
// 输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
// 示例 2：

// 输入：nums = [0,1]
// 输出：[[0,1],[1,0]]
// 示例 3：

// 输入：nums = [1]
// 输出：[[1]]
var has = function (sources, target) {
  if (sources.length === 0) return false;
  var equal = function (source, target) {
    if (source.length !== target.length) return false;
    for (let n = 0; n < source.length; n++) {
      if (source[n] !== target[n]) return false;
    }
    return true;
  };
  return sources.some((source) => equal(source, target));
};
// 通过测试，不过时间复杂应该比较高
var permuteUnique = function (nums) {
  let ans = [[nums[0]]];
  for (let left = 1; left < nums.length; left++) {
    const _left = nums[left];
    ans = ans.reduce((rets, item) => {
      for (let i = 0; i < item.length + 1; i++) {
        const _ans = [...item.slice(0, i), _left, ...item.slice(i)];
        if (!has(rets, _ans)) {
          // 数字不重复的话，不需要判断
          rets.push(_ans);
        }
      }
      return rets;
    }, []);
  }
  return ans;
};

const ans = permute([1, 2, 3]);
console.log("ans: ", JSON.stringify(ans));
